package hibernate;

import Forms.PrimerArbolForm;
import beans.Arbol;
import beans.Nodo;
import beans.Pareja;
import beans.Usuario;
import java.util.Hashtable;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
 *
 * @author Antonio
 */
public class PrimerArbolBD extends PreparacionHibernate {

    /**
     *Añade en la base de datos los nodos padre, madre e hijo
     * @param arbolForm 
     * Contiene los tres beans con informacion del padre, la madre y el nodo del usuario
     * @param usuario 
     * Usuario al que pertenece el nodo principal
     */
    public void anadir(PrimerArbolForm arbolForm, Usuario usuario) {

        boolean tieneMadre, tienePadre;
        //Comprobamos que tiene padre y madre
        tieneMadre = !arbolForm.getMadre().getApellidos().equals("");
        tienePadre = !arbolForm.getPadre().getApellidos().equals("");
        //Obtenemos el arbol y lo añadimos a la bd
        Arbol arbol = arbolForm.getArbol();
        anadirEnBD(arbol);
        //Abrimos sesion transacción
        Session sesion = getSesion();
        Transaction trans = sesion.beginTransaction();
        //Obtenemos el arbol que acabamos de añadir
        long id = arbol.getIdArbol();
        Arbol arb = (Arbol) sesion.load(Arbol.class, id);
        
        Pareja pareja1 = new Pareja();
        //Creamos los nodos madre, padre, e hijo a partir del Form
        Nodo madre = arbolForm.getMadre();
        Nodo padre = arbolForm.getPadre();
        Nodo hijo = arbolForm.getNodo();
        
        //Si existe la madre se añade
        if (tieneMadre) {
            pareja1.setComponente1(madre);        
            madre.addPareja(pareja1);
            arb.addNodo(madre);
        }
        
        //Si existe el padre se añade
        if (tienePadre) {
            pareja1.setComponente2(padre);
            padre.addPareja(pareja1);
            arb.addNodo(padre);
        }
        
        //Se añade el hijo
        arb.addNodo(hijo);
        hijo.setUsuario(usuario);
        usuario.setNodo(hijo);
        if(tieneMadre || tienePadre)
        pareja1.addHijos(hijo);

        sesion.flush();
        trans.commit();
        sesion.close();

    }

    /**
     *Indica si existe una arbol genealógico con el nombre del parámetro
     * @param Arbol. 
     * Objeto de la clase arbol que queremos comprobar que tiene nombre único
     * @return boolean
     * True si ya hay otra entrada con el mismo nombre.
     */
    public boolean existeFamilia(Arbol arbol)
    {
        boolean res;
        //Capturamos el nombre del arbol
        String nombreArbol = arbol.getNombreArbol();
        //Creamos la sentencia hql
        String query = "FROM Arbol WHERE nombreArbol = :nombreArbol";
        //Creamos un diccionario con los parámetros
        Hashtable<String,Object> hashtable = new Hashtable<String, Object>();
        hashtable.put("nombreArbol", nombreArbol);
        res = existeEn(query, hashtable);
        return res;        
    }
}
